package br.com.lojapi.dao;

import br.com.lojapi.bean.Perfil;
import br.com.lojapi.bean.Pessoa;
import br.com.lojapi.bean.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Aluno
 */
public class UsuarioDAOImp implements UsuarioDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        Usuario usuario = (Usuario) obj;
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            String SQL = "INSERT INTO usuario(login, senha, cpf, id, idPerfil) VALUES(?, ?, ?, ?, ?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, usuario.getLogin());
            ps.setString(2, usuario.getSenha());
            ps.setString(3, usuario.getCpf());
            ps.setInt(4, usuario.getId());
            ps.setInt(5, usuario.getPerfil().getId());
            ps.executeUpdate();

        } catch (SQLException se) {
            throw new Exception("Erro ao tentar inserir dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuario;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        Usuario usuario = (Usuario) obj;
        PreparedStatement ps = null;
        Connection conn = null;

        try {
            String SQL = "UPDATE usuario SET login=?, senha=?, cpf, idPerfil=? WHERE idPessoa=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, usuario.getLogin());
            ps.setString(2, usuario.getSenha());
            ps.setString(2, usuario.getCpf());
            ps.setInt(4, usuario.getPerfil().getId());
            ps.setInt(5, usuario.getId());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public List<Usuario> procuraPorTipo(String tipo) throws SQLException, Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = null;
        Pessoa pessoa = null;
        Perfil perfil = null;
        List<Usuario> usuarios = new LinkedList();
        try {
            String pesquisa = "SELECT  u.*, pe.* "
                    + "FROM usuario u "
                    + "JOIN pessoa pe "
                    + "ON pe.idPessoa = pe.id WHERE u.tipo ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(pesquisa);
            ps.setString(1, "%" + tipo + "%");
            rs = ps.executeQuery();
            while (rs.next()) {
//                pessoa = new Pessoa();
                perfil = new Perfil();
                pessoa.setNome(rs.getString("pe.nome"));
                pessoa.setId(rs.getInt("pe.id"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                usuario.setEmail(rs.getString("email"));
                perfil.setId(rs.getInt("idPerfil"));
                perfil.setDescricao(rs.getString("descricao"));
                usuario.setPerfil(perfil);
                usuarios.add(usuario);
            }

        } catch (Exception e) {
            System.out.println("Erro ao procurar usuário " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }

        return usuarios;
    }

     @Override
    public Usuario logar(String login, String senha) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = new Usuario();
        try {
            conn = FabricaConexao.getConnection();
            String consulta = "SELECT p.id, nome FROM pessoa p "
                    + "JOIN usuario u ON p.id = u.id WHERE login = ? AND "
                    + "senha = ?";
            ps = conn.prepareStatement(consulta);
            ps.setString(1, login);
            ps.setString(2, senha);
            rs = ps.executeQuery();
            if (rs.next()) {
                usuario.setId(rs.getInt("p.id"));
                usuario.setLogado(true);
                
                usuario.setNome(rs.getString("nome"));
            }
        } catch (Exception e) {
            System.out.println("Erro ao tentar logar " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuario;
    }

    @Override
    public List<Usuario> usuNaoCadastrados() throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = null;
        List<Usuario> usuarios = new LinkedList();
        try {
            String pesquisa = "SELECT * FROM pessoa WHERE idUsuario is null";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(pesquisa);
            rs = ps.executeQuery();

            while (rs.next()) {
                usuario = new Usuario();
                usuario.setId(rs.getInt("id"));
                usuario.setNome(rs.getString("nome"));
                usuario.setCpf(rs.getString("cpf"));
                usuario.setEmail(rs.getString("email"));

                usuarios.add(usuario);
            }

        } catch (Exception e) {
            System.out.println("Erro ao procurar usuarios " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }

        return usuarios;
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String SQL = "DELETE FROM pessoa WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar excluir dados"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = null;
        try {
            conn = FabricaConexao.getConnection();
            String consulta = "SELECT * FROM usuario = ?";
            ps = conn.prepareStatement(consulta);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                usuario = new Usuario();
                usuario.setId(rs.getInt("p.id"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEmail(rs.getString("email"));
                usuario.setTelefone(rs.getString("telefone"));
            }
        } catch (Exception e) {
            System.out.println("Erro ao tentar procurar " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return usuario;
    }

    @Override
    public List<Object> listar() throws Exception {
        PreparedStatement psmt = null;
        Connection conn = null;
        ResultSet rs = null;
        Usuario usuario = null;
        List usuarios = new ArrayList();
        try {
            conn = FabricaConexao.getConnection();
            psmt = conn.prepareStatement("SELECT * FROM usuario");
            rs = psmt.executeQuery();
            while (rs.next()) {
                usuario = new Usuario();
                usuario.setId(rs.getInt("id"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEmail(rs.getString("email"));
                usuario.setTelefone(rs.getString("telefone"));
                usuarios.add(usuario);
            }
        } catch (Exception e) {
            System.out.println("erro ao consultar todas as pessoas: "
                    + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, psmt, rs);
        }
        return usuarios;
    }
}